home *** CD-ROM | disk | FTP | other *** search
- #!/bin/bash
-
- # Copyright (C) 1998, 2002, 2006, 2007 Free Software Foundation
- # Copyright (C) 1993 Jean-loup Gailly
-
- # Modified for XZ Utils by Andrew Dudman and Lasse Collin.
-
- # This program is free software; you can redistribute it and/or modify
- # it under the terms of the GNU General Public License as published by
- # the Free Software Foundation; either version 2 of the License, or
- # (at your option) any later version.
-
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- # GNU General Public License for more details.
-
- #SET_PATH - This line is a placeholder to ease patching this script.
-
- # Instead of unsetting XZ_OPT, just make sure that xz will use file format
- # autodetection. This way memory usage limit and thread limit can be
- # specified via XZ_OPT. With gzip and bzip2 it's OK to just unset the
- # environment variables.
- xz='xz --format=auto'
- unset GZIP BZIP BZIP2
-
- case ${0##*/} in
- *cmp*) prog=xzcmp; cmp=${CMP:-cmp};;
- *) prog=xzdiff; cmp=${DIFF:-diff};;
- esac
-
- version="$prog (XZ Utils) 5.0.0"
-
- usage="Usage: ${0##*/} [OPTION]... FILE1 [FILE2]
- Compare FILE1 to FILE2, using their uncompressed contents if they are
- compressed. If FILE2 is omitted, then the files compared are FILE1 and
- FILE1 from which the compression format suffix has been stripped.
-
- Do comparisons like '$cmp' does. OPTIONs are the same as for '$cmp'.
-
- Report bugs to <lasse.collin@tukaani.org>."
-
- # sed script to escape all ' for the shell, and then (to handle trailing
- # newlines correctly) turn trailing X on last line into '.
- escape='
- s/'\''/'\''\\'\'''\''/g
- $s/X$/'\''/
- '
-
- while :; do
- case $1 in
- --h*) printf '%s\n' "$usage" || exit 2; exit;;
- --v*) echo "$version" || exit 2; exit;;
- --) shift; break;;
- -*\'*) cmp="$cmp '"`printf '%sX\n' "$1" | sed "$escape"`;;
- -?*) cmp="$cmp '$1'";;
- *) break;;
- esac
- shift
- done
- cmp="$cmp --"
-
- for file; do
- test "X$file" = X- || <"$file" || exit 2
- done
-
- xz1=$xz
- xz2=$xz
- xz_status=0
- exec 3>&1
-
- if test $# -eq 1; then
- case $1 in
- *[-.]xz | *[-.]lzma | *.t[lx]z)
- ;;
- *[-.]bz2 | *.tbz | *.tbz2)
- xz1=$bzip2;;
- *[-.][zZ] | *_z | *[-.]gz | *.t[ag]z)
- xz1=$gzip;;
- *)
- echo >&2 "$0: $1: Unknown compressed file name suffix"
- exit 2;;
- esac
- case $1 in
- *[-.][zZ] | *_z | *[-.][gx]z | *[-.]bz2 | *[-.]lzma)
- FILE=`expr "X$1" : 'X\(.*\)[-.][abglmxzZ2]*$'`;;
- *.t[abglx]z)
- FILE=`expr "X$1" : 'X\(.*[-.]t\)[abglx]z$'`ar;;
- *.tbz2)
- FILE=`expr "X$1" : 'X\(.*[-.]t\)bz2$'`ar;;
- esac
- xz_status=$(
- exec 4>&1
- ($xz1 -cd -- "$1" 4>&-; echo $? >&4) 3>&- | eval "$cmp" - '"$FILE"' >&3
- )
- elif test $# -eq 2; then
- case $1 in
- *[-.]bz2 | *.tbz | *.tbz2) xz1=$bzip2;;
- *[-.][zZ] | *_z | *[-.]gz | *.t[ag]z) xz1=$gzip;;
- esac
- case $2 in
- *[-.]bz2 | *.tbz | *.tbz2) xz2=$bzip2;;
- *[-.][zZ] | *_z | *[-.]gz | *.t[ag]z) xz2=$gzip;;
- esac
- case $1 in
- *[-.][zZ] | *_z | *[-.][gx]z | *[-.]bz2 | *[-.]lzma | *.t[abglx]z | *.tbz2 | -)
- case "$2" in
- *[-.][zZ] | *_z | *[-.][gx]z | *[-.]bz2 | *[-.]lzma | *.t[abglx]z | *.tbz2 | -)
- if test "$1$2" = --; then
- xz_status=$(
- exec 4>&1
- ($xz1 -cdfq - 4>&-; echo $? >&4) 3>&- |
- eval "$cmp" - - >&3
- )
- elif # Reject Solaris 8's buggy /bin/bash 2.03.
- echo X | (echo X | eval "$cmp" /dev/fd/5 - >/dev/null 2>&1) 5<&0; then
- xz_status=$(
- exec 4>&1
- ($xz1 -cdfq -- "$1" 4>&-; echo $? >&4) 3>&- |
- ( ($xz2 -cdfq -- "$2" 4>&-; echo $? >&4) 3>&- 5<&- </dev/null |
- eval "$cmp" /dev/fd/5 - >&3) 5<&0
- )
- case $xz_status in
- *[1-9]*) xz_status=1;;
- *) xz_status=0;;
- esac
- else
- F=`expr "/$2" : '.*/\(.*\)[-.][ablmtxz2]*$'` || F=$prog
- tmp=
- trap '
- test -n "$tmp" && rm -f "$tmp"
- (exit 2); exit 2
- ' HUP INT PIPE TERM 0
- tmp=`mktemp -t -- "$F.XXXXXX"` || exit 2
- $xz2 -cdfq -- "$2" > "$tmp" || exit 2
- xz_status=$(
- exec 4>&1
- ($xz1 -cdfq -- "$1" 4>&-; echo $? >&4) 3>&- |
- eval "$cmp" - '"$tmp"' >&3
- )
- cmp_status=$?
- rm -f "$tmp" || xz_status=$?
- trap - HUP INT PIPE TERM 0
- (exit $cmp_status)
- fi;;
- *)
- xz_status=$(
- exec 4>&1
- ($xz1 -cdfq -- "$1" 4>&-; echo $? >&4) 3>&- |
- eval "$cmp" - '"$2"' >&3
- );;
- esac;;
- *)
- case "$2" in
- *[-.][zZ] | *_z | *[-.][gx]z | *[-.]bz2 | *[-.]lzma | *.t[abglx]z | *.tbz2 | -)
- xz_status=$(
- exec 4>&1
- ($xz2 -cdfq -- "$2" 4>&-; echo $? >&4) 3>&- |
- eval "$cmp" '"$1"' - >&3
- );;
- *)
- eval "$cmp" '"$1"' '"$2"';;
- esac;;
- esac
- else
- echo >&2 "$0: Invalid number of operands; try \`${0##*/} --help' for help"
- exit 2
- fi
-
- cmp_status=$?
- test "$xz_status" -eq 0 || exit 2
- exit $cmp_status
-